﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ForrajeriaDB; //ESTE USING VA EN TODOS LOS ELEMENTOS DE ESTA CAPA
using System.Data;
using System.Data.SqlClient;

namespace ForrajeriaDAL
{
    public class FacturaDAL : AccesoDAL, InterfazDAL<FacturaMO>
    {
        private static string insert = "Factura_INSERT";
        private static string all = "Factura_GetALL";
        
        private SqlCommand cmd; //var de comando sql

        #region "Singleton"

        private static FacturaDAL instance;

        private FacturaDAL()
            : base()
        {

        }


        public static FacturaDAL Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new FacturaDAL();
                }
                return instance;
            }
        }

        #endregion

        #region Interfaz

        public List<FacturaMO> GetAll()
        {
            throw new NotImplementedException();
        }

        public int AdicionarConRetorno(FacturaMO item)
        {
            cmd = new SqlCommand(insert, getConexion());

            cmd.CommandType = CommandType.StoredProcedure;
            int codigo = getCodigoInsert("Factura", "nroFactura");
            cmd.Parameters.Add("@nroFactura", SqlDbType.Int).Value = codigo;
            cmd.Parameters.Add("@codigoCliente", SqlDbType.Int).Value =item.CodigoCliente;
            cmd.Parameters.Add("@fecha", SqlDbType.DateTime).Value = item.Fecha;
            cmd.Parameters.Add("@totalFactura", SqlDbType.Decimal).Value = item.TotalFactura;
            if(item.CodigoEmpleado !=null)
                cmd.Parameters.Add("@codigoEmpleado",SqlDbType.Int).Value = item.CodigoEmpleado;

            cmd.Parameters.Add("@tipoFactura",SqlDbType.Char).Value = item.TipoFactura;
            if (item.NroPedido != null)
            {cmd.Parameters.Add("@nroPedido", SqlDbType.Int).Value = item.NroPedido;}

            try
            {
                opencon();
                cmd.ExecuteNonQuery();

                closecon();
                return codigo;
            }
            catch (Exception ex)
            {
                closecon();
                throw ex;
            }
            
        }

        public void Eliminar(FacturaMO item)
        {
            throw new NotImplementedException();
        }

        public void Actualizar(FacturaMO nuevoItem, FacturaMO origItem)
        {
            throw new NotImplementedException();
        }

        #endregion

        public DataTable reporteVentasEmpleado(DateTime fecha, string ordena = "", string dire = "")
        {
            string sql = "";
            sql = "select top 1 t.codigo as 'Codigo',MAX(t.total) as 'Total',CONVERT(varchar(10) ,t.fecha,103) as 'Fecha', t.nombre 'Nombre', t.apellido as 'Apellido',t.teléfono as 'Telefono',t.tipoDocumento as 'Tipo de Documento',t.nroDocumento as 'Numero de Documento',t.direccion as 'Direccion' "
                        + "from ( "
                        + " SELECT f.codigoEmpleado as codigo,SUM(f.totalFactura) as total, f.fecha , e.nombre, e.apellido,e.teléfono,d.tipoDocumento,e.nroDocumento,((convert(varchar(50),isnull(e.calle,'-')))+' '+(convert(varchar(50),isnull(e.nro,'-')))+' '+(convert(varchar(50),isnull(e.piso,'')))+' '+(convert(varchar(50),isnull(e.dpto,'')))) as direccion "
                        + " FROM Empleado e "
                        + " left join TipoDocumento d on e.tipoDocumento = d.codigo "
                        + " inner join Factura f on e.codigo = f.codigoEmpleado "
                        + " group by f.fecha ,f.codigoEmpleado,e.nombre, e.apellido,e.teléfono,d.tipoDocumento,e.nroDocumento,((convert(varchar(50),isnull(e.calle,'-')))+' '+(convert(varchar(50),isnull(e.nro,'-')))+' '+(convert(varchar(50),isnull(e.piso,'')))+' '+(convert(varchar(50),isnull(e.dpto,'')))) ) t "
                        + " group by t.codigo,t.fecha,t.nombre,t.apellido,t.nroDocumento,t.tipoDocumento,t.direccion,t.teléfono "
                        + " having 1=1 ";

            try
            {
                DataTable dt = new DataTable();

                SqlCommand cmd = new SqlCommand();

                if (fecha != null)
                {

                    sql += " and  t.fecha = @fecha";
                    cmd.Parameters.Add("@fecha", SqlDbType.DateTime).Value = fecha;
                }

                if (ordena != "")
                {

                    sql += " Order by " + ordena;

                }
                if (dire != "")

                    sql += " " + dire;


                cmd.Connection = (getConexion());

                cmd.CommandText = sql;
                cmd.CommandType = CommandType.Text;
                SqlDataAdapter da = new SqlDataAdapter(cmd);

                opencon();
                da.Fill(dt);
                closecon();
                return dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                closecon();
            }

        }

        public DataTable reporteVentasDelDia(DateTime fecha, string ordena = "", string dire = "")
        {
            string sql = "";
            sql = "SELECT  f.tipoFactura as 'Tipo_Factura', f.nroFactura as 'Numero_Factura', f.codigoCliente 'Codigo_Cliente', (c.NombreCliente+' '+c.ApellidoCliente) as 'Cliente', f.fecha as 'Fecha', f.totalFactura as 'Total',f.codigoEmpleado as 'Codigo_Empleado', (case(f.nroPedido) when null then 'NO' else 'SI' end) as 'Por_Pedido'"
		        +" FROM Factura f "
		        +" left join Cliente c on f.codigoCliente = c.codigo"
    		    +" left join Empleado e on f.codigoEmpleado = e.codigo"
	            +" where (f.fecha = @fecha)";

            try
            {
                DataTable dt = new DataTable();

                SqlCommand cmd = new SqlCommand();

                if (ordena != "")
                {

                    sql += " Order by " + ordena;

                }
                if (dire != "")

                    sql += " " + dire;


                cmd.Parameters.Add("@fecha",SqlDbType.DateTime).Value = fecha;
                cmd.Connection = (getConexion());

                cmd.CommandText = sql;
                cmd.CommandType = CommandType.Text;
                SqlDataAdapter da = new SqlDataAdapter(cmd);

                opencon();
                da.Fill(dt);
                closecon();
                return dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                closecon();
            }

        }

        public DataTable reporteDetalleFactura(int nro)
        {
            string sql = "";
            sql = "select df.nroLinea as 'Detalle', f.nombreForraje as 'Forraje', '$'+convert(varchar(10),df.precio) as 'Precio',df.cantidad as 'Cantidad' from "
                + " DetalleFactura df left join Forraje f on df.forraje = f.codigoForraje"
                +" where df.nroFactura = @nro";

            try
            {
                DataTable dt = new DataTable();

                SqlCommand cmd = new SqlCommand();
                

                cmd.Parameters.Add("@nro", SqlDbType.Int).Value = nro;
                cmd.Connection = (getConexion());

                cmd.CommandText = sql;
                cmd.CommandType = CommandType.Text;
                SqlDataAdapter da = new SqlDataAdapter(cmd);

                opencon();
                da.Fill(dt);
                closecon();
                return dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                closecon();
            }
        }

        public void Adicionar(FacturaMO item)
        {
            throw new NotImplementedException();
        }
    }
}
